<?php
// ------------------------------------------------------------------------
// |@Author       : Jarmin <edshop@qq.com>
// |@----------------------------------------------------------------------
// |@Date         : 2023-05-31 20:42:55
// |@----------------------------------------------------------------------
// |@LastEditTime : 2023-06-03 22:48:11
// |@----------------------------------------------------------------------
// |@LastEditors  : Jarmin <jarmin@ladmin.cn>
// |@----------------------------------------------------------------------
// |@Description  : 
// |@----------------------------------------------------------------------
// |@FilePath     : FileClassify.php
// |@----------------------------------------------------------------------
// |@Copyright (c) 2023 http://www.ladmin.cn   All rights reserved. 
// ------------------------------------------------------------------------
namespace app\api\model;

use think\admin\Model;

class FileClassify extends Model
{
    /**
     * 获取文件分类数据列表
     * @param  array $data 查询条件列表，包含 title 等字段
     * @return array       返回菜单数据列表
     */
    public static function listFileClassify(array $data): array
    {
        // 根据查询条件组织 where 子句查询数组。
        $where = !empty($data['name']) ? [["name", "like", "%" . $data['name'] . "%"]] : [["id", ">", 0]];
        // // 查询数据库获取符合条件的菜单数据。
        $menus = static::mk()->where($where)->order('id, pid, sort')->select()->toArray();
        // 返回菜单数据列表。
        return $menus ? $menus : [];
    }
    
    /**
     * 保存文件分类数据
     * @param array $data 菜单数据列表，包含 title 等字段
     * @return array 返回保存后的菜单数据
     */
    public static function saveFileClassify(array $data): array
    {
        $fn = function () use ($data) {
            // 如果没有传入 id 值，则执行插入操作。
            if (empty($data['id'])) {
                $data['id'] = static::mk()->strict(false)->insertGetId($data);
            } else {
                // 如果有 id 值，则执行更新操作。
                static::mk()->strict(false)->where('id', $data['id'])->update($data);
            }

            // 返回保存后的菜单数据。
            return $data;
        };

        return static::mk()->runTransaction($fn);
    }

    /**
     * 批量删除文件分类项
     * @param array $data 要删除的文件分类项 ID 列表
     * @return bool 返回删除成功的状态
     */
    public static function removeFileClassify(array $data): bool
    {
        $fn = function () use ($data) {
            // 找到所有待删除的节点和它们的所有子节点。
            $toDelete = static::mk()->whereIn('id', $data['ids'])->select()->toArray();

            $toDeleteIds = array_column($toDelete, 'id');
            foreach ($toDelete as $item) {
                $toDeleteIds = array_merge($toDeleteIds, static::getDescendantIds($item['id']));
            }

            // 删除所有待删除的节点和它们的所有子节点。
            static::mk()->whereIn('id', $toDeleteIds)->delete();

            return true;
        };

        return static::mk()->runTransaction($fn);
    }
}